home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / napigator.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  4KB  |  176 lines

  1. /* Copyright (C) 2001 drscholl@users.sourceforge.net
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: napigator.c,v 1.4 2001/03/03 01:00:06 drscholl Exp $ */
  6.  
  7. /*** support for Napigator ***/
  8.  
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. #include <errno.h>
  13. #include "opennap.h"
  14. #include "debug.h"
  15. #include "md5.h"
  16.  
  17. static char *stat_server_salt = 0;
  18.  
  19. void
  20. stat_server_read (void)
  21. {
  22.     int     n;
  23.     char   *p;
  24.     int     do_close = 0;
  25.     char   *salt;
  26.  
  27.     n = read (global.stat_server_fd, Buf, sizeof (Buf));
  28.     if (n <= 0)
  29.     {
  30.     if (n == -1)
  31.         perror ("read");
  32.     log ("stat_server_read: got hangup");
  33.     do_close = 1;
  34.     }
  35.     else
  36.     {
  37.     /* find end of line */
  38.     p = strpbrk (Buf, "\r\n");
  39.     if (*p)
  40.         *p = 0;
  41.     p = Buf;
  42.  
  43.     n = atoi (Buf);
  44.     if (n == 220)
  45.     {
  46.         /* got connect
  47.  
  48.          * first, save the salt */
  49.         next_arg (&p);
  50.         salt = next_arg (&p);
  51.         if (!salt)
  52.         {
  53.         log ("stat_server_read:unable to get salt string");
  54.         strcpy (Buf, "QUIT\r\n");
  55.         write (global.stat_server_fd, Buf, strlen (Buf));
  56.         }
  57.         else
  58.         {
  59.         if (stat_server_salt)
  60.             FREE (stat_server_salt);
  61.         stat_server_salt = STRDUP (salt);
  62.  
  63.         snprintf (Buf, sizeof (Buf), "USER %s\r\n", global.stat_user);
  64.  
  65.         write (global.stat_server_fd, Buf, strlen (Buf));
  66.         }
  67.     }
  68.     else if (n == 221)
  69.     {
  70.         /* server hangup */
  71.         do_close = 1;
  72.     }
  73.     else if (n == 300)
  74.     {
  75.         struct md5_ctx md;
  76.         char    hash[33];
  77.  
  78.         md5_init_ctx (&md);
  79.         md5_process_bytes (stat_server_salt, strlen (stat_server_salt),
  80.                    &md);
  81.         md5_process_bytes (global.stat_pass, strlen (global.stat_pass),
  82.  
  83.                    &md);
  84.         md5_finish_ctx (&md, hash);
  85.         expand_hex (hash, 16);
  86.         hash[32] = 0;
  87.         snprintf (Buf, sizeof (Buf), "PASS %s\r\n", hash);
  88.         write (global.stat_server_fd, Buf, strlen (Buf));
  89.     }
  90.     else if (n == 201)
  91.     {
  92.         /* auth complete */
  93.         log ("stat_server_read: logged in");
  94.  
  95.         /* send updated ip:port in case we are a dynamic server */
  96.         snprintf (Buf, sizeof (Buf), "IPPORT %s %s %d\r\n",
  97.             global.report_name,
  98.             global.report_ip,
  99.             global.report_port);
  100.         write (global.stat_server_fd, Buf, strlen (Buf));
  101.  
  102.         /* force immediate update */
  103.         stat_server_push ();
  104.     }
  105.     else if (n / 100 >= 4)
  106.     {
  107.         /* something failed */
  108.         log ("stat_server_read:%s", Buf);
  109.         strcpy (Buf, "QUIT\r\n");
  110.         write (global.stat_server_fd, Buf, strlen (Buf));
  111.     }
  112.     else if (n == 200)
  113.     {
  114.         /* stats updated successfully */
  115.     }
  116.     else
  117.     {
  118.         log ("stat_server_read: unhandled:%s", Buf);
  119.     }
  120.     }
  121.  
  122.     if (do_close)
  123.     {
  124.     log ("stat_server_read: closing connection");
  125.     close (global.stat_server_fd);
  126. #if HAVE_POLL
  127.     remove_fd (global.stat_server_fd);
  128. #else
  129.     FD_CLR (global.stat_server_fd, &global.read_fds);
  130.     FD_CLR (global.stat_server_fd, &global.write_fds);
  131. #endif
  132.     global.stat_server_fd = -1;
  133.     }
  134. }
  135.  
  136. void
  137. stat_server_push (void)
  138. {
  139.     unsigned int ip;
  140.  
  141.     if (global.stat_server_fd == -1)
  142.     {
  143.     /* attempt to make new connection to stats server */
  144.     if (!*global.stat_user || !*global.stat_pass || !*global.stat_server)
  145.     {
  146.         return;        /* nothing defined */
  147.     }
  148.  
  149.     global.stat_server_fd = make_tcp_connection (global.stat_server,
  150.                        global.stat_server_port, &ip);
  151.     if (global.stat_server_fd != -1)
  152.     {
  153.         /* do a nonblocking connect */
  154.         add_fd (global.stat_server_fd);
  155.         set_write (global.stat_server_fd);
  156.     }
  157.     return;
  158.     }
  159.  
  160.     snprintf (Buf, sizeof (Buf), "STATS %s %u %u 0 %.0f 0\r\n",
  161.           global.report_name, Users->dbsize, Num_Files, Num_Gigs * 1024);
  162.  
  163.     if (write (global.stat_server_fd, Buf, strlen (Buf)) == -1)
  164.     {
  165.     log ("stat_server_push: write: %s (%d)", strerror (errno), errno);
  166.     close (global.stat_server_fd);
  167. #if HAVE_POLL
  168.     remove_fd (global.stat_server_fd);
  169. #else
  170.     FD_CLR (global.stat_server_fd, &global.read_fds);
  171.     FD_CLR (global.stat_server_fd, &global.write_fds);
  172. #endif
  173.     global.stat_server_fd = -1;
  174.     }
  175. }
  176.